﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Twodi.Interfaces;
using Microsoft.Xna.Framework;
using Twodi.Aspect.Interfaces;

namespace Twodi.Aspect.Implemented
{
    public class CollideableBoxAspect : DependentAspect<ICollideableBoxAspect>, ICollideableBox
    {
        /// <summary>
        /// Caixa geral de colisão, que fica ao redor de todas as outras caixas.
        /// Deixar nulo se ignorar.
        /// </summary>
        private Rectangle? masterBox;

        public CollideableBoxAspect(ICollideableBoxAspect component, params Rectangle[] box)
            : base(component)
        {
            CollisionBox = box;

            this.Component.PositionProperties.PositionChanged += (sender, e) =>
            {
                if (MasterBox.HasValue)
                {
                    Rectangle tempBox = MasterBox.Value;
                    tempBox.X += (int)e.Difference.X;
                    tempBox.Y += (int)e.Difference.Y;
                    MasterBox = tempBox;
                }

                for (int i = 0; i < CollisionBox.Length; i++)
                {
                    CollisionBox[i].X += (int)e.Difference.X;
                    CollisionBox[i].Y += (int)e.Difference.Y;
                }
            };
        }

        /// <summary>
        /// Caixa geral de colisão, que fica ao redor de todas as outras caixas.
        /// Deixar nulo se ignorar.
        /// </summary>
        public Rectangle? MasterBox
        {
            get
            {
                return this.masterBox;
            }
            set
            {
                OnPropertyChanged<Rectangle?>("MasterBox", ref masterBox, value);
            }
        }

        /// <summary>
        /// Caixas de colisão.
        /// </summary>
        public Rectangle[] CollisionBox
        {
            get;
            set;
        }

        /// <summary>
        /// Evento invocado quando caixa geral é alterada.
        /// </summary>
        public event EventHandler MasterBoxChanged;

        /// <summary>
        /// Invocar evento que informa que a caixa geral foi alterada.
        /// </summary>
        /// <param name="e"></param>
        protected virtual void onMasterBoxChanged(EventArgs e)
        {
            if (MasterBoxChanged != null) MasterBoxChanged(this, e);
        }
    }
}
